package from001to010;

/**
 * Find the greatest product of five consecutive digits 
 * in the 1000-digit number.
 * 		73167176531330624919225119674426574742355349194934
 * 		96983520312774506326239578318016984801869478851843
 * 		85861560789112949495459501737958331952853208805511
 *		12540698747158523863050715693290963295227443043557
 *		66896648950445244523161731856403098711121722383113
 *		62229893423380308135336276614282806444486645238749
 * 		30358907296290491560440772390713810515859307960866
 * 		70172427121883998797908792274921901699720888093776
 *		65727333001053367881220235421809751254540594752243
 * 		52584907711670556013604839586446706324415722155397
 *		53697817977846174064955149290862569321978468622482
 *		83972241375657056057490261407972968652414535100474
 *		82166370484403199890008895243450658541227588666881
 *		16427171479924442928230863465674813919123162824586
 *		17866458359124566529476545682848912883142607690042
 *		24219022671055626321111109370544217506941658960408
 *		07198403850962455444362981230987879927244284909188
 *		84580156166097919133875499200524063689912560717606
 *		05886116467109405077541002256983155200055935729725
 *		71636269561882670428252483600823257530420752963450
 */

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Problem008 
{
	public static int charToInt(char c)
	{
		if (!(c >= '0' && c <= '9')) {
			System.err.println("Invalid Character Input");
			throw new NumberFormatException();
		}
		
		return c - '0';
	}

	public static boolean copyArray(int[] from, int[] to)
	{
		if (from.length != to.length) {
			return false;
		}
		
		for (int i = 0; i < from.length; i++) {
			to[i] = from[i];
		}
		
		return true;
	}
	
	public static long findProduct(int[] array)
	{
		long returnValue = 1;
		
		for (int i = 0; i < array.length; i++) {
			returnValue *= array[i];
		}
		
		return returnValue;
	}
	
	public static void main(String[] args)
	{
		final int NUM_CONSEC = 13;
		
		File inputFile = new File("problem/from001to010/Problem008.txt");
		Scanner fin = null;
		
		String line = null;
		int temp = 0;
		int[] maxList = new int[NUM_CONSEC];
		int[] numList = new int[NUM_CONSEC];
		long maxProd = 1;
		long tempProd = 1;
		
		try {
			fin = new Scanner(inputFile);
			
			long start = System.currentTimeMillis();
			if (fin.hasNextLine()) {
				line = fin.nextLine();
				
				numList[0] = charToInt(line.charAt(0));
				maxProd = numList[0];
				
				int left = NUM_CONSEC - 1;
				int index = 1;
				
				while (left > 0)
				{
					numList[NUM_CONSEC - left]
							= charToInt(line.charAt(index));
					maxProd *= numList[NUM_CONSEC - left];
			
					index++;
					if (index == line.length()) 
					{
						if (!fin.hasNextLine()) {
							System.out.println(maxProd);
							fin.close();
							System.exit(0);
						}
						
						line = fin.nextLine();
						index = 0;
					}
					left--;
				}
				tempProd = maxProd;
				copyArray(numList, maxList);
				
				int first = 0;
				
				do {
					for (int i = index; i < line.length(); i++)
					{
						int num = charToInt(line.charAt(i));
						numList[first] = num;
						tempProd = findProduct(numList);
						first = (first + 1) % NUM_CONSEC;
						
						if (tempProd > maxProd) {
							maxProd = tempProd;
							copyArray(numList, maxList);
							temp = first;
						}
						
						numList[first] = num;
					}
					
					if (!fin.hasNextLine()) {
						break;
					}
					
					line = fin.nextLine();
					index = 0;
				} while(true);
			}
			long stop = System.currentTimeMillis();
			
			System.out.println(start + " " + stop + " " + (stop - start));
			System.out.println(maxProd);
			for (int i = 0; i < NUM_CONSEC; i++) {
				System.out.print(maxList[i] + " ");
			}
			System.out.println("\n" + temp);
		} catch (FileNotFoundException | NumberFormatException e) {
			System.err.println("Invalid Input File. Error Message: "
					+ e.toString());
			System.exit(1);
		} finally {
			if (fin != null) {
				fin.close();
			}
		}
	}
}
